package api

import (
	"gitee.com/tang_q/gin-vue3-admin-api/global"
	"gitee.com/tang_q/gin-vue3-admin-api/model"
	"gitee.com/tang_q/gin-vue3-admin-api/model/dto"
	"gitee.com/tang_q/gin-vue3-admin-api/utils"
	"github.com/gin-gonic/gin"
)

type RoleApi struct {
	BaseApi
}

func NewRoleApi() RoleApi {
	return RoleApi{
		BaseApi: NewBaseApi(),
	}
}

func (r RoleApi) GetRoleList(c *gin.Context) {
	r.ctx = c
	reqData := dto.RoleFilterAndPaginationReq{}
	if err := c.ShouldBind(&reqData); err != nil {
		r.Fail(201, "参数错误:"+err.Error(), nil)
		return
	}
	roleList, total, err := model.GetRoleList(reqData)
	if err != nil {
		global.Logger.Error("获取角色列表失败", err)
		r.Fail(201, "获取角色列表失败", nil)
		return
	}
	menuList, err := model.GetMenusListByType()
	if err != nil {
		global.Logger.Error(err)
		r.Fail(201, "权限树失败", nil)
		return
	}
	r.Success("获取角色列表成功", gin.H{
		"roleList": roleList,
		"total":    total,
		"menuList": menuList,
	})
}
func (r RoleApi) GetRoleByID(c *gin.Context) {
	r.ctx = c
	id := c.Query("id")
	role, err := model.GetRoleByID(id)
	if err != nil {
		global.Logger.Error("获取角色失败", err)
		r.Fail(201, "获取角色失败", nil)
		return
	}
	r.Success("获取角色成功", role)
}

// CreateRole 添加角色
func (r RoleApi) CreateRole(c *gin.Context) {
	r.ctx = c
	reqData := dto.CreateRoleDTO{}
	if err := c.ShouldBind(&reqData); err != nil {
		global.Logger.Error("添加角色参数错误", err)
		r.Fail(201, "参数错误:"+err.Error(), nil)
		return
	}
	user := model.Users{}
	userLoginName, _ := c.Get("loginName")
	userLoginNameStr, _ := utils.ToString(userLoginName)
	if err := user.GetUsersByLoginName(userLoginNameStr); err != nil {
		global.Logger.Error("更新角色获取用户失败", err)
		r.Fail(201, "获取更新用户失败", nil)
		return
	}
	if err := model.CreateRole(reqData, &user); err != nil {
		global.Logger.Error("添加角色失败", err)
		r.Fail(201, "添加角色失败"+err.Error(), nil)
		return
	}
	r.Success("添加角色成功", nil)
}

// UpdateRole 更新角色API
func (r RoleApi) UpdateRole(c *gin.Context) {
	r.ctx = c
	roleDTO := dto.UpdateRoleDTO{}
	if err := c.ShouldBind(&roleDTO); err != nil {
		global.Logger.Error("更新角色参数错误", err)
		r.Fail(201, "参数错误:"+err.Error(), nil)
		return
	}
	user := model.Users{}
	userLoginName, _ := c.Get("loginName")
	userLoginNameStr, _ := utils.ToString(userLoginName)
	if err := user.GetUsersByLoginName(userLoginNameStr); err != nil {
		global.Logger.Error("更新角色获取用户失败", err)
		r.Fail(201, "获取更新用户失败", nil)
		return
	}
	// 更新角色
	if err := model.UpdateRole(roleDTO, &user); err != nil {
		global.Logger.Error("更新角色失败", err)
		r.Fail(201, "更新角色失败", nil)
		return
	}
	r.Success("更新角色成功", nil)
}

// DeleteRole 删除角色API
func (r RoleApi) DeleteRole(c *gin.Context) {
	r.ctx = c
	id := c.Query("id")
	if err := model.DeleteRole(id); err != nil {
		global.Logger.Error("删除角色失败", err)
		r.Fail(201, "删除角色失败", nil)
		return
	}
	r.Success("删除角色成功", nil)
}

// DeleteRoles 批量删除角色API
func (r RoleApi) DeleteRoles(c *gin.Context) {
	r.ctx = c
	idsReq := dto.DelRoleByIDsReq{}
	if err := c.ShouldBind(&idsReq); err != nil {
		global.Logger.Error("批量删除角色参数错误", err)
		r.Fail(201, "参数错误:"+err.Error(), nil)
		return
	}
	if err := model.DeleteRoles(idsReq); err != nil {
		global.Logger.Error("批量删除角色失败", err)
		r.Fail(201, "批量删除角色失败", nil)
		return
	}
	r.Success("批量删除角色成功", nil)
}
